package recursion;

/**
 * @program: play-structure
 * 移除链表元素,删除链表中等于给定值 val 的所有节点。
 * @author: baichen
 **/
public class RemoveLinkedListElement {
    public ListNode removeElements(ListNode head, int val) {
        while (head != null && head.val == val) {//传入的链表不能为空【如果传入的 val 在头部，则删除头结点】
            //【如果要删除的头结点与给定的头结点相等的话,则第二个节点仍与给定的节点相同，故使用 while 】
            ListNode delNode = head;    //待删除节点就是head节点
            head = head.next;           //绕过要删除的节点
            delNode.next = null;        //删除节点
        }
        if (head == null) {
            return null;
        }
        ListNode prev = head;   //【如果传入的 val 在中间，则要找到待删除元素的前一个节点】
        //遍历链表
        while (prev.next != null) {//还没有遍历到最后一个节点，每次查看下一个节点是否需要被删除
            //【if 中删除结束后，prev 不要向后诺，因为下一个元素任然可能是要删除的元素，故加while】
            if (prev.next.val == val) {         //如果 val 和传入的 val 相同，则需要删除
                ListNode delNode = prev.next;   //prev 的下一个节点就是要删除的节点
                prev.next = delNode.next;
                delNode.next = null;
            } else {
                prev = prev.next;       //如果不用被删除，则 prev 向后挪一下
            }
        }
        return head;
    }
}
